package org.jerrymouse.jsa4j.db.kv;

import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.lf5.viewer.LogFactor5Dialog;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

/**
 * 由于是JSON数据库，为了方便，提供一个JSON引擎。以jackson为核心，可以提供类似@jsonIngnore这样的注解支持。
 * 
 * @author yankai
 * 
 * @param <T>目标对象类型
 */
public class JsonUtil<T> {
	ObjectMapper mapper;
	private static Log log = LogFactory.getLog(JsonUtil.class);

	public JsonUtil() {
		mapper = new ObjectMapper();
		mapper.getSerializationConfig().disable(
				SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
	}

	/**
	 * JSON转换为对象。
	 * 
	 * @param json
	 *            JSON信息
	 * @param type
	 *            对象的类型
	 * @return 对象
	 */
	public T toBean(String json, Class<? extends T> type) {
		try {
			if (json == null)
				return null;
			return mapper.readValue(json, type);
		} catch (JsonParseException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 对象转换为JSON
	 * 
	 * @param bean
	 *            对象
	 * @return JSON字符串
	 */
	public String toJson(T bean) {
		try {
			if (bean == null)
				return null;
			return mapper.writeValueAsString(bean);
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;

	}

	// @SuppressWarnings("unchecked")
	// protected Class<T> getTclass() {
	// Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass()
	// .getGenericSuperclass()).getActualTypeArguments()[0];
	// return entityClass;
	// }
	// protected T jsonToObj(String json) {
	// ObjectMapper mapper = new ObjectMapper();
	// T obj = null;
	// try {
	// JsonNode node = mapper.readTree(json);
	// node = node.get("data");
	// obj = mapper.readValue(node.traverse(), getTclass());
	// } catch (JsonParseException e) {
	// e.printStackTrace();
	// } catch (JsonMappingException e) {
	// e.printStackTrace();
	// } catch (IOException e) {
	// e.printStackTrace();
	// }
	// return obj;
	// }
}
